$(function () {
    let $img = $(".form-item .captcha-graph-img img");   //获取图像标签元素
    let sImageCodeId = "";
    let $username = $("#username");
    let $password = $("#password");
    let $password_repeat = $("#password_repeat");
    let $mobile = $("#mobile");
    let $authbtn = $(".form-item .sms-captcha");
    let $text = $("#input_captcha");
    let $register = $('.form-contain');


    generateImageCode();
    $img.click(generateImageCode);

    //判断密码是否符合要求
    function fn_check_password() {
        let sPassword = $password.val();
        if (sPassword === "") {
            message.showError('密码不能为空');
            // alert('密码不能为空');
            return
        }
        if (!(/^\w{6,20}$/).test(sPassword)) {
            message.showError('请输入6-20长度的密码');
            // alert('请输入6-20长度的密码');
            return
        }
    }
    //密码验证逻辑
    $password.blur(function () {
        fn_check_password();
    });
    
    //密码比较是否一致
    function fn_diff_password() {
        let sPassword = $password.val();
        let sPassword_repeat = $password_repeat.val();
        if (sPassword !== sPassword_repeat){
            message.showError('请输入相同的密码');
            return
        }
        if (sPassword_repeat === ""){
            message.showError('确认密码不能为空');
            // alert('确认密码不能为空');
            return
        }
    };

    //密码一致性验证
    $password_repeat.blur(function () {
        fn_diff_password();
    });

    //生成uuid
    function generateUUID() {
    let s = [];
    let hexDigits = "0123456789abcdef";
    for (let i = 0; i < 36; i++) {
        s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
    }
    s[14] = "4";  // bits 12-15 of the time_hi_and_version field to 0010
    s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01
    s[8] = s[13] = s[18] = s[23] = "-";

    let uuid = s.join("");
    return uuid;
}

    //检测用户名是否存在
    function fn_check_username() {
        let sUsername = $username.val();
        let Sreturnvalue = "";
        if (sUsername === ""){
            message.showError('用户名不能为空');

            return
        }
        if (!(/^\w{2,10}$/).test(sUsername)){
            message.showError('请输入5-20个字符的用户名');
            // alert('请输入5-20个字符的用户名');
            return
        }
        //发送ajax请求,去后端查询用户名是否存在
        $.ajax({
            url:'usernames/'+ sUsername +'/',
            type:'GET',
            dataType:'json',
            async:false,
        })
            .done(function (res) {
                if (res.data.count !== 0){
                    message.showError(res.data.username  + '已经注册了')
                    SreturnValue = ""
                } else {
                    message.showInfo(res.data.username + '能正常使用')
                    SreturnValue = "success"
                }
                })
            .fail(function () {
               message.showError('服务器超时，请重试！');
               SreturnValue = ""
            })
        return SreturnValue
    }

    //检查手机号码是否符合要求
    function fn_check_phonenumber() {
        let sMobile = $mobile.val();
        let Sreturnvalue = "";
        if (sMobile === "") {
            message.showError('手机号码不能为空');
            return
        }
        if (!(/^1[3-9]\d{9}$/).test(sMobile)) {
            message.showError('请输入正确的手机号码');
            return
        }
        $.ajax({
            url: '/mobiles/' + sMobile + '/',
            type: 'GET',
            dataType: 'json',
            async: false	// 把async关掉
        })
            .done(function (res) {
                if (res.data.count !== 0) {
                    message.showError(res.data.mobile + '已注册，请重新输入！')
                    SreturnValue = ""
                } else {
                    SreturnValue = "success"
                }
            })
            .fail(function () {
                message.showError('服务器超时，请重试！');
                SreturnValue = ""
            });
        return SreturnValue
    }

    //生成图片链接 修改img 属性 src
    function generateImageCode() {
        sImageCodeId = generateUUID();
        let imageCodeUrl = "/image_codes/"+ sImageCodeId + "/";
        $img.attr('src',imageCodeUrl)
    }

    //用户名验证逻辑
    $username.blur(function () {
        fn_check_username();
    });

    //手机号码验证逻辑
    $mobile.blur(function () {
        fn_check_phonenumber();
    });

    //点击获取验证码来判断手机号是否符合要求和是否注册
    $authbtn.click(function () {
        if (fn_check_phonenumber() !== "success"){
            return
        }
        let sMobile = $mobile.val();
        let sText = $text.val();

        if (!sImageCodeId) {
            message.showError('uuid为空')
            return
        }
        if (!sText) {
            message.showError('请输入图形验证码')
            return
        }

        let SdataParams = {
            "mobile": sMobile,
            "text": sText,
            "img_code_id": sImageCodeId,
        };

        //发送ajax请求,去后端查询用户名是否存在
        $.ajax({
            url: "/smsmobiles/",
            type: "POST",
            dataType: "json",
            data: JSON.stringify(SdataParams),
            contentType: "application/json; charset=utf-8",
            async: false
        })
        .done(function (res) {
           if (res.errno === "0"){
               message.showSuccess("短信验证码发送成功");
               let num = 60;
               let t = setInterval(function () {
                    if (num === 1){
                        clearInterval(t);
                        $authbtn.html("获取短语验证码")
                    }else {
                        num -= 1;
                        $authbtn.html(num + "秒")
                    }
               },1000)
           }else {
               message.showError(res.errmsg)
           }
           })
        .fail(function(){
            message.showError("服务器超时,请重试")
            });

    })

    // 5、注册逻辑
  $register.submit(function (e) {
    // 阻止默认提交操作
    e.preventDefault();

    // 获取用户输入的内容
    let sUsername = $username.val();  // 获取用户输入的用户名字符串
    let sPassword = $("input[name=password]").val();
    let sPasswordRepeat = $("input[name=password_repeat]").val();
    let sMobile = $mobile.val();  // 获取用户输入的手机号码字符串
    let sSmsCode = $("input[name=sms_captcha]").val();

    // 判断用户名是否已注册
    if (fn_check_username() !== "success") {
      return
    }

    // 判断手机号是否为空，是否已注册
    if (fn_check_phonenumber() !== "success") {
      return
    }

    // 判断用户输入的密码是否为空
    if ((!sPassword) || (!sPasswordRepeat)) {
      message.showError('密码或确认密码不能为空');
      return
    }

    // 判断用户输入的密码和确认密码长度是否为6-20位
    if ((sPassword.length < 6 || sPassword.length > 20) ||
      (sPasswordRepeat.length < 6 || sPasswordRepeat.length > 20)) {
      message.showError('密码和确认密码的长度需在6～20位以内');
      return
    }

    // 判断用户输入的密码和确认密码是否一致
    if (sPassword !== sPasswordRepeat) {
      message.showError('密码和确认密码不一致');
      return
    }


    // 判断用户输入的短信验证码是否为6位数字
    if (!(/^\d{6}$/).test(sSmsCode)) {
      message.showError('短信验证码格式不正确，必须为6位数字！');
      return
    }

    // 发起注册请求
    // 1、创建请求参数
    let SdataParams = {
      "username": sUsername,
      "password": sPassword,
      "password_repeat": sPasswordRepeat,
      "mobile": sMobile,
      "sms_code": sSmsCode
    };

    // 2、创建ajax请求
    $.ajax({
        // 请求地址
        url: "/users/register/",  // url尾部需要添加/
        // 请求方式
        type: "POST",
        data: JSON.stringify(SdataParams),
        // 请求内容的数据类型（前端发给后端的格式）
        contentType: "application/json; charset=utf-8",
        // 响应数据的格式（后端返回给前端的格式）
        dataType: "json",
        async: false

    })
      .done(function (res) {
        if (res.errno === "0") {
          // 注册成功
          message.showSuccess('恭喜你，注册成功！');
          setTimeout(function () {
            // 注册成功之后重定向到主页
            window.location.href = document.referrer;
          }, 1000)
        } else {
          // 注册失败，打印错误信息
          message.showError(res.errmsg);
        }
      })
      .fail(function(){
        message.showError('服务器超时，请重试！');
      });

  });


     // get cookie using jQuery
    function getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
      let cookies = document.cookie.split(';');
      for (let i = 0; i < cookies.length; i++) {
        let cookie = jQuery.trim(cookies[i]);
        // Does this cookie string begin with the name we want?
        if (cookie.substring(0, name.length + 1) === (name + '=')) {
          cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
          break;
        }
      }
    }
    return cookieValue;
  }

    function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  }

  // Setting the token on the AJAX request
    $.ajaxSetup({
        beforeSend: function (xhr, settings) {
            if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
      }
    }
  });

});
